Контекстная и внеконтекстная передача управления на сервер

#std636

Область применения: управляемое приложение, мобильное приложение.

1. Платформа 1С:Предприятие позволяет передавать управление из клиентского в серверный код модуля формы двумя способами: контекстно и внеконтекстно.

При внеконтекстной передаче управления на сервер передаются только те данные, которые явно специфицированы разработчиком в параметрах процедуры (функции) с директивой компиляции &НаСервереБезКонтекста.

При контекстной передаче управления на сервер, помимо параметров процедуры (функции) с директивой компиляции &НаСервере, передаются еще и данные формы, которые были изменены на клиенте за период с момента предыдущего контекстного серверного вызова (см. ниже приложение). При этом на сервере выполняется ряд дополнительных действий по инициализации методов формы и серверной копии данных формы, что может увеличивать общее время, которое сервер затрачивает на обработку вызванной процедуры (функции).

2.1. Контекстную передачу управления следует использовать в случаях когда:

При этом следует учитывать, что в некоторых клиентских обработчиках событий форм (ПередЗаписью, ПослеЗаписи, ПередЗакрытием, ПриЗакрытии и др.) не допускается вызов контекстных серверных процедур, а также выполнение действий, которые могут привести к неявному серверному вызову. Подробности см. в документации платформы.

Для устранения контекстного серверного вызова есть несколько способов:

Неправильно:

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
  ПриИзмененииОбразцаНаСервере();
КонецПроцедуры

Правильно:

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
  ПодключитьОбработчикОжидания("ПриИзмененииОбразца", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииОбразца()
  ПриИзмененииОбразцаНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииОбразцаНаСервере()
  ...
КонецПроцедуры

2.2. В случае, если на форме размещена таблица, при активизации строки которой необходимо обновлять содержимое формы (например, выводить подробности к выделенной строке), то в обработчике таблицы ПриАктивизацииСтроки следует подключать однократный обработчик ожидания. В нем выполнять действия, которые приводят к перестроению формы: контекстные серверные вызовы, изменение свойств элементов формы и т.п. При этом чтобы избежать повторных вызовов ПриАктивизацииСтроки, необходимо запоминать текущую строку (ИдентификаторТекущейСтроки) и не выполнять обновление формы, если она не изменилась.

В остальных случаях рекомендуется использовать внеконтекстную передачу управления с клиента на сервер.

3. При передаче управления с клиента на сервер недопустимо использовать объекты типов ДанныеФормыСтруктура, ДанныеФормыКоллекция, ДанныеФормыСтруктураСКоллекцией, ДанныеФормыДерево и ТабличныйДокумент в качестве параметров функции, передаваемых по значению. При передаче таких типов по значению с клиента на сервер всегда передается полная копия объекта, а не только измененные данные.
Вести работу с этими типами следует на сервере, для чего переходить с клиента на сервер с помощью явного контекстного вызова сервера.
Например, неправильно:

// Модуль формы

&НаКлиенте
Процедура КоличествоОтмененныхСтрокЗаказа()
  КоличествоСтрок = ОбщийМодульВызовСервера.КоличествоОтмененныхСтрок(Объект.Товары);   // Неоптимальная передача на сервер табличной части "Товары"
КонецПроцедуры

// Общий серверный модуль ОбщийМодульВызовСервера

Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть);
  НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("Отменено", Истина));
  Возврат НайденныеСтроки.Количество();
КонецФункции

Правильно:

// Модуль формы

&НаКлиенте
Процедура КоличествоОтмененныхСтрокЗаказа()
  КоличествоСтрок = КоличествоОтмененныхСтрок(); // Передача табличной части "Товары" выполняется неявно платформой, оптимально
КонецПроцедуры

&НаСервере
Процедура КоличествоОтмененныхСтрок()
  Возврат ОбщийМодульВызовСервера.КоличествоОтмененныхСтрок(Объект.Товары); // вызов "сервер"-"сервер" без доп. накладных расходов
КонецПроцедуры

// Общий серверный модуль ОбщийМодульВызовСервера

Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть);
  НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("Отменено", Истина));
  Возврат НайденныеСтроки.Количество()
КонецФункции

Приложение

При контекстной передаче управления на сервер в платформе 1С:Предприятие действуют следующие правила передачи измененных данных формы между клиентом и сервером:

См. также